VRC UDON
ちょっと情報古い
Getting Start
VRChat Udon Discussion Forum
公式フォーラム
Getting Started with Udon
公式ドキュメントで案内されているフォーラム内のページ
VRChat Udon (OPEN ALPHA) ことはじめ
総合tips集(@naqtn)
IfとForのサンプル
Blockノードはサファードパターンみたいな挙動をする。Branchと組み合わせる。
variable系ノード
variable Vector3 で、メンバ変数のような物を作成できる
set variable get variable で操作できる
論理演算
---
UdonSharp関連
OnCollisionEnterを使うとVRCPickupで付与されるRigidbodyでisKinematicが使えなくてちょっと難儀する
参考:
同期回りの仕様
ベースはPhoton?
UdonBehavourによる同期
自動的にObjectのTransformを同期する
同期する時の基準(誰の状態を展開するのか)は、そのObjectの所有権(Ownership)によって決定する
Allow Ownership Transfer on Collisionで、OnCollisionEnter時に相手のOwnershipを自分にコピーする
変数同期
メンバ変数を同期する。書き方は以下
code:cs
int _num;
前提として、そのオブジェクトのOwnershipを持っておかないと、変数を変えられない。
code:cs
//追加(Cubeに対するオーナーを変更)
if (!Networking.IsOwner(Networking.LocalPlayer, this.gameObject))
Networking.SetOwner(Networking.LocalPlayer, this.gameObject);
処理同期
code:cs
public override void Interact() {
if (!Particle.isPlaying)
SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "Emit");
}
public void Emit() {
Particle.Play();
}
第1引数には2種類の値が入れられる
VRC.Udon.Common.Interfaces.NetworkEventTarget.All
全てのプレイヤーに
VRC.Udon.Common.Interfaces.NetworkEventTarget.Owner
(たぶん)部屋のマスターに?
黒鳥さんはObjectOwnerに向くと書いてるけど・・・???
雑記
何もしない場合、各オブジェクトの座標は同期されない。
とりあえず物体の座標を同期するだけなら、UdonBehavourにある、Synchronize Positionで出来る
OnCollisionEnterのイベントなんかは、ObjectOwnerに向けて発火する模様
同期周りの観察
ドラムキット
太鼓とバチを接触させると音がなる。バチはVRCPickupとUdonBehavourで同期
OnCollisionEnterは各クライアントで発生している模様(たまに反応が大量発生するけど)
音を出す処理PlayOneshotは各ローカル環境でしか動いていない模様。CustomEventで全クライアントに再生を指示してあげないといけない
ラジコン
コントローラーの相対位置を元にラジコンのRigidbody.velocityに値を入れる。ラジコンはUdonBehavorで同期
ラジコンオブジェクトもコントローラ操作主に権限渡さないと、ラジコンの動きにラグが出る模様
ラジコンが何かにぶつかると、著しく挙動がおかしくなる・・・
Instantiate
単にCustomeInstantiateしただけ
スポーンさせるPrefabはワールドのマネージャみたいなやつに登録しておく必要がある
ただ、PrefabにVRCPickupを付けてたのに、Instantiateしたら機能していなかった・・・なぜ・・・・
一方で、UdonBehavorによる位置同期は機能している・・・?
スポーンしたCubeをドラムキットにぶつけて、Owner指定で音を鳴らしてみたものの、ワールドマスターに指示が飛んでる模様。よくわからん・・・
VRC Pickup
Orientation
Gun
+Xが前 +Zが上のような持ち方になる